package com.aspire.aimini.service;

import com.aspire.aimini.model.dto.MaterialDTO;
import com.aspire.aimini.model.query.MaterialQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 素材Service接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description 素材业务逻辑接口
 */
public interface MaterialService {

    /**
     * 上传素材
     *
     * @param files       文件列表
     * @param description 描述信息
     * @param userId      用户ID
     * @return 上传成功的素材列表
     */
    List<MaterialDTO> uploadMaterials(List<MultipartFile> files, String description, Long userId);

    /**
     * 分页查询素材列表
     *
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<MaterialDTO> getMaterialPage(MaterialQuery query);

    /**
     * 根据ID获取素材详情
     *
     * @param id     素材ID
     * @param userId 用户ID
     * @return 素材详情
     */
    MaterialDTO getMaterialById(Long id, Long userId);

    /**
     * 更新素材信息
     *
     * @param id          素材ID
     * @param description 描述
     * @param isFavorite  是否收藏
     * @param isArchived  是否归档
     * @param userId      用户ID
     * @return 更新后的素材信息
     */
    MaterialDTO updateMaterial(Long id, String description, Boolean isFavorite, Boolean isArchived, Long userId);

    /**
     * 删除素材
     *
     * @param id     素材ID
     * @param userId 用户ID
     */
    void deleteMaterial(Long id, Long userId);

    /**
     * 批量删除素材
     *
     * @param ids    素材ID列表
     * @param userId 用户ID
     */
    void batchDeleteMaterials(List<Long> ids, Long userId);

    /**
     * 为素材添加标签
     *
     * @param materialId 素材ID
     * @param tagIds     标签ID列表
     * @param userId     用户ID
     */
    void addTagsToMaterial(Long materialId, List<Long> tagIds, Long userId);

    /**
     * 从素材移除标签
     *
     * @param materialId 素材ID
     * @param tagIds     标签ID列表
     * @param userId     用户ID
     */
    void removeTagsFromMaterial(Long materialId, List<Long> tagIds, Long userId);

    /**
     * 增加素材查看次数
     *
     * @param id     素材ID
     * @param userId 用户ID
     */
    void incrementViewCount(Long id, Long userId);

    /**
     * 增加素材下载次数
     *
     * @param id     素材ID
     * @param userId 用户ID
     */
    void incrementDownloadCount(Long id, Long userId);

    /**
     * 获取用户收藏的素材列表
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return 分页结果
     */
    IPage<MaterialDTO> getFavoriteMaterials(Long userId, Integer page, Integer size);

    /**
     * 获取最近上传的素材
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 素材列表
     */
    List<MaterialDTO> getRecentMaterials(Long userId, Integer limit);

    /**
     * 根据标签查询素材
     *
     * @param tagIds 标签ID列表
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return 分页结果
     */
    IPage<MaterialDTO> getMaterialsByTags(List<Long> tagIds, Long userId, Integer page, Integer size);

    /**
     * 搜索相似素材
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @param limit      限制数量
     * @return 相似素材列表
     */
    List<MaterialDTO> findSimilarMaterials(Long materialId, Long userId, Integer limit);

    /**
     * 获取用户素材统计信息
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    Map<String, Object> getUserMaterialStats(Long userId);

    /**
     * 按文件类型统计素材数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countByFileType(Long userId);

    /**
     * 按来源类型统计素材数量
     *
     * @param userId 用户ID
     * @return 统计结果
     */
    List<Map<String, Object>> countBySourceType(Long userId);

    /**
     * 清理过期的临时文件
     *
     * @return 清理数量
     */
    int cleanExpiredTempFiles();

    /**
     * 生成素材缩略图
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 缩略图路径
     */
    String generateThumbnail(Long materialId, Long userId);

    /**
     * 批量生成缩略图
     *
     * @param materialIds 素材ID列表
     * @param userId      用户ID
     * @return 成功生成的数量
     */
    int batchGenerateThumbnails(List<Long> materialIds, Long userId);

    /**
     * 检查文件是否已存在
     *
     * @param fileHash 文件哈希值
     * @param userId   用户ID
     * @return 是否存在
     */
    boolean checkFileExists(String fileHash, Long userId);

    /**
     * 获取文件下载URL
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 下载URL
     */
    String getDownloadUrl(Long materialId, Long userId);
}